package com.heima.common.exception;

import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @Description:  目的是给用户提供友好的提示信息
 * @Version: V1.0
 */
@Slf4j
@Configuration
@RestControllerAdvice   // Springmvc 异常处理拦截注解
public class ExceptionCatch {
    /**
     * 解决项目中所有的异常拦截
     * @return
     */
    @ExceptionHandler(Exception.class)  // exception 所有子类
    public ResponseResult exception(Exception ex) {
        ex.printStackTrace();
        // 记录日志
        log.error("捕获到全局异常 ex:{}", ex);
        return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR, "您的网络异常，请稍后重试");
    }

    @ExceptionHandler(CustomException.class)  // exception 所有子类
    public ResponseResult handleCustomException(CustomException e) {
        e.printStackTrace();
        // 记录日志
        log.error("捕获到自定义异常 ex:{}", e);
        return ResponseResult.errorResult(e.getAppHttpCodeEnum());
    }

    @ExceptionHandler(HttpMessageNotReadableException.class)  // exception 所有子类
    public ResponseResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
        e.printStackTrace();
        // 记录日志
        log.error("捕获到HttpMessageNotReadableException异常 ex:{}", e);
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE, "请求体内容不能为空");
    }

    /**
     * 处理 xxxcontroller 中方法参数 无效异常
     *
     * @param e e
     * @return 通用的结果返回类
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseResult handleMethodArgumentNotValidException
            (MethodArgumentNotValidException e) {
        e.printStackTrace();
        // 记录日志
        log.error("捕获到MethodArgumentNotValidException异常 ex:{}", e);
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,
                e.getBindingResult().getFieldError().getDefaultMessage());
    }

}